Частина 4. Адміністратор даних

Частина 1. Вступ
Частина 2. Загальна структура
Частина 3. Первинні ланцюжки
Частина 4. Адміністратор даних
Частина 5. Адміністратор процесів
Частина 6. Структура додатка
Частина 7. Публікація в GCP

У цій статті я розповім, як написати просту адмінку для KVS на NITRO і N2O на 5 рядків!.

Постановка задачі

Сторінки

KVS.Index

def event(:init) def event(:writers) def event({:link,id}) def event(:user) def event(:session) def event(:enode))

Червоним кольором виділено ідентифікатори DOM елементів, які замінюються на пререндеровані на сервері шматки HTML сніпетів. Як це відбувається в Live View і навіть PHP! Але на відміну від використання Suck and Blow нотації для темплейт енжинів, таких як ASP, PHP, EEX, DTL та інших, NITRO пропонує вбудовування в хост мову або глибоке вбудовування HTML5 Erlang в даному випадку і є фреймворком, який перебуває у своєму класі: OCaml Ocsigen, Scala Lift, SML UrWeb, F# WebSharper, Erlang Nitrogen. Основна ідея - пишемо все однією мовою і навчати новачків треба одній мові причому одночасно показуючи як писати на ньому веб-додатки, які і так всі розуміють як писати.

priv/static/kvs.htm

<nav> <a href='login.htm'>LOGIN</a> <a href='plm.htm'>PLM</a> <a href='bpe.htm'>BPE</a> <a href='form.htm'>FORM</a> <a href='kvs.htm'>KVS</a> </nav> <aside> <article> <section> <h2>KVS</h2> <p>Abstract chain database</p> <div>USER: <span id=user></span> SSD: <span id=disc></span> RAM: <span id=ram></span><br> SESSION: <span id=session></span> VM: <span id=enode></span></div> </section> <div class=container> <div><h2>WRITERS</h2> <div id=writers></div></div> <div><h2>CHAINS</h2> <div id=feeds>To display the chain select the writer.</div></div> </div> </article> </aside>

lib/events/kvs.ex

defmodule KVS.Index do use N2O, with: [:n2o, :nitro] use FORM use KVS require ERP require Logger def parse(ERP."Employee"(person: ERP."Person"(cn: name))), do: name def parse(_), do: [] def event(:init), do: [:user, :writers, :session, :enode] |> Enum.map(fn x -> [ NITRO.clear(x), send(self(), {:direct, x})] end) def event(:user), do: NITRO.update(:user, span(body: parse(:n2o.user()))) def event(:session), do: NITRO.update(:session, span(body: :n2o.sid())) def event(:enode), do: NITRO.update(:enode, span(body: NITRO.compact(:erlang.node()))) def event({:link, i}), do: [ NITRO.clear(:feeds), :kvs.feed(i) |> Enum.map(fn t -> NITRO.insert_bottom(:feeds, panel(body: NITRO.compact(t))) end) ] def event(:writers), do: :writer |> :kvs.all() |> :lists.sort() |> Enum.map(fn writer(id: i, count: c) -> NITRO.insert_bottom( :writers, panel(body: [link(body: i, postback: {:link, i}), ' (' ++ NITRO.to_list(c) ++ ')'])) end) def event(_), do: [] def ram(os), do: NITRO.compact(os) end

Роутер

kvs — KVS.Index

Код програми можна знайти в наступних репозиторіях:

erpuno/plm